package ar.edu.ufasta.presupuestos.servicios.web;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;

import ar.edu.ufasta.presupuestos.logica.entidades.Cliente;
import ar.edu.ufasta.presupuestos.logica.entidades.estados.Aprovado;
import ar.edu.ufasta.presupuestos.logica.entidades.estados.Conformado;
import ar.edu.ufasta.presupuestos.logica.entidades.presupuesto.Presupuesto;
import ar.edu.ufasta.presupuestos.servicios.persistencia.ObjectID;
import ar.edu.ufasta.presupuestos.servicios.persistencia.PersistenceFacade;
import ar.edu.ufasta.presupuestos.servicios.web.netpacks.ListaPresupuestoRequest;
import ar.edu.ufasta.presupuestos.servicios.web.netpacks.ListaPresupuestoResponse;
import ar.edu.ufasta.presupuestos.servicios.web.netpacks.RequestPack;
import ar.edu.ufasta.presupuestos.servicios.web.netpacks.ResponsePack;

public class GetListaPresupuesto extends Protocol {

	private ListaPresupuestoRequest request;
	private ListaPresupuestoResponse response;
	
	public GetListaPresupuesto(){
		super();
		response = new ListaPresupuestoResponse();
	}
	
	@Override
	public int execute() {
		response.setProtocol(Constantes.PROTOCOL_100);
		response.setSystemCode(Constantes.SYSTEM_CODE);
		response.setResultCode(Constantes.TRANSACTION_OK);
		
		List<Presupuesto> listado;
		List<Hashtable<String, Object>> listaRespuesta = new ArrayList<Hashtable<String,Object>>();
		try {
			Hashtable<String, Object> record;
			Cliente miCliente = (Cliente)PersistenceFacade.getInstance().get(new ObjectID(request.getIdCliente()), Cliente.class);
			response.setNombreCliente(miCliente.getApellido()+", "+miCliente.getNombre());
			response.setEmailCliente(miCliente.getEmail());
			
			if(request.getTipoLista()==Constantes.LISTA_PR_ALL){
				listado = miCliente.getAllPresupuestos();
			}else if(request.getTipoLista() == Constantes.LISTA_PR_APROBADOS){
				listado = miCliente.getAllPresupuestosPorEstado(new Aprovado());
			}else if(request.getTipoLista() == Constantes.LISTA_PR_CONFORMADOS){
				listado = miCliente.getAllPresupuestosPorEstado(new Conformado());
			}else{
				listado = miCliente.getAllPresupuestos();
			}
			
			if (listado.size() == 0){
				LogFile.write("---- Transaction Result -> LISTA-PRESUPUESTOS VACIA");
				response.setResultCode(Constantes.ERROR_NO_PRESUPUESTOS);
				return 0;
			}
			int countReg=0;
			for (Iterator<Presupuesto> iterator = listado.iterator(); iterator.hasNext();) {
				Presupuesto presupuestoAct = (Presupuesto) iterator.next();
				record = new Hashtable<String, Object>();
				// Armo fila de presupuesto
				record.put("pID", presupuestoAct.getIDValue());
				record.put("pFechaEmision", presupuestoAct.getFechaEmision());
				record.put("pFormaPago", presupuestoAct.getFormaPago().getDescripcion());
				record.put("pTotal", presupuestoAct.getTotal());
				record.put("pEstado", presupuestoAct.getEstado().getNombre());
				listaRespuesta.add(record);
			}
			LogFile.write("---- Transaction Result -> LISTA-PRESUPUESTOS OK");
			response.setListaPrespuestos(listaRespuesta);
		} catch (Exception e) {
			response.setResultCode(Constantes.ERROR_SERVER_ERROR);
			LogFile.write("**** Error in MySQL queries ****");
			return -1;
		}
		
		return 0;
	}

	/**
	 * @return the request
	 */
	public ListaPresupuestoRequest getRequest() {
		return request;
	}

	/**
	 * @return the response
	 */
	public ListaPresupuestoResponse getResponse() {
		return response;
	}

	/**
	 * @param request the request to set
	 */
	public void setRequest(ListaPresupuestoRequest request) {
		this.request = request;
	}

	/**
	 * @param response the response to set
	 */
	public void setResponse(ListaPresupuestoResponse response) {
		this.response = response;
	}

	@Override
	public String getOperationMsg() {
		return "---- Received Request   -> LISTA-PRESUPUESTOS";
	}

	@Override
	public ResponsePack getRespuesta() {
		return (ListaPresupuestoResponse)this.response;
	}

	@Override
	public void setPedido(RequestPack request) {
		this.request = (ListaPresupuestoRequest)request;		
	}

}
